package com.woniuxy.service.impl;

import com.woniuxy.dao.PermissionMapper;
import com.woniuxy.dto.MenuDto;
import com.woniuxy.entity.Permission;
import com.woniuxy.service.PermissionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

@Service
public class PermissionServiceImpl implements PermissionService {

    @Autowired
    private PermissionMapper permissionMapper;
    /**
     * 通过用户id查询权限，并且生成相应菜单
     * @param userId
     */
    @Override
    public List<MenuDto> findPermissionsMenu(Integer userId) {
        //1查询当前用户的所有权限
        List<Permission> permissions = permissionMapper.findPermissionsByUserId(userId);
        //2.创建菜单集合
        List<MenuDto> menuDtos = new ArrayList<>();
        //3封装一级菜单
        List<Permission> main = permissions.stream().filter(permission -> permission.getLevel() == 1) //显示一级菜单
                .sorted(Comparator.comparingInt(Permission::getSort)) //按sort进行排序
                .collect(Collectors.toList());//收集成集合
        //4.封装2级菜单
        for (Permission m : main) {
            //创建菜单对象
            MenuDto menuDto = new MenuDto();
            //进行添加一级菜单
            menuDto.setMain(m);
            //找到二级菜单//父id等于当前的id，并且是2级菜单，同时按sort排序
            List<Permission> sub = permissions.stream().filter(permission -> permission.getParentId() == m.getId() && permission.getLevel() == 2)
                    .sorted(Comparator.comparingInt(Permission::getSort))
                    .collect(Collectors.toList());
            //添加到子菜单中
            menuDto.setSub(sub);
            //将菜单加到集合中
            menuDtos.add(menuDto);
        }
        //5.返回封装好的菜单
        return menuDtos;
    }

    /**
     * 通过用户id查询自身访问地址
     *
     * @param userId
     */
    @Override
    public List<String> findUserUrls(Integer userId) {
        //1.获取当前用户所有的权限
        List<Permission> permissions = permissionMapper.findPermissionsByUserId(userId);
        //2.从上面权限列表中只获取他的访问地址这一列，去掉url为空的
        List<String> urls = permissions.stream().map(permission -> permission.getUrl()).filter(url -> url != null).collect(Collectors.toList());
        return urls;
    }

    /**
     * 使用Map来封装2组数组
     * 1. 所有的权限
     * 2. 某个角色的权限
     *
     * @param roleId
     */
    @Override
    public Map<String, Object> findPermissionTree(Integer roleId) {
        //1、封装所有权限到权限中
        //查询所有权限
        List<Permission> permissionList = permissionMapper.findAll();
        //创建一个集合封装权限树
        List<Permission> resultList = new ArrayList<>();
        //获取第一级别权限
        permissionList.forEach(permission -> {
            if (permission.getLevel()==1){
                //调用递归方法添加子集
                resultList.add(addChildren(permission, permissionList));
            }
        });
        //1.4 放到Map中返回数据
        Map<String,Object> resultMap = new HashMap<>();
        resultMap.put("permissionsList",resultList);

        //2.封装某个角色已经有的权限
        List<Integer> permissionIds = permissionMapper.findPermissionIds(roleId);
        resultMap.put("rolePermissionIds",permissionIds);
        return resultMap;
    }
    /**
     * 递归的方法：给权限添加子元素，并且返回结果
     * @param permission 要封装的权限对象
     * @param permissionList 所有权限的列表
     */
    private Permission addChildren(Permission permission,List<Permission> permissionList){
        //遍历这个元素
        permissionList.forEach(p ->{
            //如果当前遍历的元素的父id等于我的id，则你是我的子元素
            if (permission.getId() == p.getParentId()){
                //添加之前要判断是否有子元素
                if (permission.getChildren()==null){
                    permission.setChildren(new ArrayList<>());
                }
                //添加成当前子元素
                permission.getChildren().add(addChildren(p,permissionList));
            }
        });
        return permission;
    }

}
